2017/07/24

Recent entries from same category

  1. VimConf 2023 Tiny に参加しました
  2. Vim で Go 言語を書くために行った引越し作業 2020年度版
  3. Vim をモダンな IDE に変える LSP の設定
  4. ぼくがかんがえたさいきょうの Vim のこうせい 2019年 年末版
  5. VimConf 2019 を終えて

ひさびさ Vim のエントリを書く気がします。

今から4年ほど前、Vim にスレッドセーフなメッセージキューが欲しいというメールが vim-dev 届きます。

[PATCH] Proof of concept: thread-safe message queue
https://groups.google.com/forum/#!searchin/vim_dev/tarruda%7Csort:relevance/vim_dev/65jjGqS1_VQ/fFiFrrIBwNAJ

その時はまだ、vim-dev の中にも「Vim はエディタだし必要ない」といった空気があったと思います。

[PATCH] Non-blocking job control for vimscript
https://groups.google.com/forum/#!searchin/vim_dev/tarruda%7Csort:relevance/vim_dev/QF7Bzh1YABU/02-YGr7_sCwJ

そしてその数か月後、もう一つのメールが届きます。ノンブロッキングでプロセスを制御する為のパッチです。

このパッチに関して vim-dev は特に反対意見を持っていませんでした。しかし Bram から反応が得られませんでした。昔から vim-dev を知っている人であれば分かると思うのですが、Bram はまずこういった機能追加の要望があった際にはまず皆の反応を確かめます。盛り上がったら取り込むし、盛り上がらなかったらボツという事です。僕も、大昔にソケット通信のパッチを送ってボツにされた事もありますし、mruby を組み込むパッチを送って誰からも相手されなかった事があります。

その反応が気に入らないという人もいました。この2つのメールを送ってきた人、その人もそうでした。そう、この2つのメールを送ってきた人こそが後に Neovim を作る事になった人です。Neovim は Vim のコードをベースに色々な機能を盛り込み、Vim と差別化する事で資金を調達しました。その中でも特徴的だったのが端末機能です。Vim のウィンドウの一つに端末を割り当てられる事で Vim の中だけで色々なシェル操作を完結できるという、とてもキャッチ―な物でした。非同期通信やタイマーといった API は現在の Vim にも備わっています。Bram は元々 fork を参考にしないという頑固な人なので、同じ様な機能を実装するのに時間は掛かってしまったかもしれませんが、channel/job に関しては Neovim 以上の物が実装されています。しかしながらこの端末機能についてはサポートされてきませんでした。ところがつい先日の 7/3 突然 Bram が口を開きました。

Adding terminal emulator support in Vim
https://groups.google.com/forum/#!topic/vim_dev/Q9gUWGCeTXM

長い間、私は Vim の中で端末エミュレータを追加する事がはたして良いアイデアであるのか疑問を持ち続けてきました。 それは危険なことですし、規模も大きくなり、そしてメンテナンスの悪夢にもなり得ます。 しかしそれと同時に、これは非常に、非常に便利になり得ます。

私が今回これを望んだ理由は、ssh 接続で Vim をデバッグする為です。 私はローカルで程よい設定をしていますが、家にいない時はいつも苦しんでいます。 これらの多くの制限は、いつも私が家に帰りデバッグする時間を延期してしまいます。 これを提供するプラグインがありますが、Vim をデバッグするには端末で実行する必要があるのです。

そういって突然 terminal への興味を示しました。僕は以前、Qiita にこんな記事を書いた事がありました。

Vim のソースのいじり方(:terminal を作るまで) - Qiita

この記事は [Vim Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vim)、18日目の記事です。 # はじめに ここ数年で、...

http://qiita.com/mattn/items/ee438479b09055a2f305

そこで作った物を Bram に見せたところ、面白いと興味を持ってくれました。しばらくして Vim のマスターブランチに :terminal の実装が入り始めます。しかし標準入出力を操作する dumb 端末でしかありませんでした。

これはいっちょやってやるかと、winpty を使って Windows で terminal を動かすパッチを送りつけました。

support :terminal on Windows by mattn · Pull Request #1854 · vim/vim · GitHub

diff --git a/src/terminal.c b/src/terminal.c index df40866ba..bc632e7cb 100644 --- a/src/terminal.c ...

https://github.com/vim/vim/pull/1854

7/19 日の事ですから、わずか3日前の事です。Bram もとても興味を持ってくれた様でした。それから Bram と僕でパッチを書き続け、先ほど入ったパッチでようやく一段落した様な気がします。

terminal

まさか4年前に、Vim が数年後にこんな事が出来る様になるなんって思っていませんでした。自分でパッチを書いておきながら少し感動してしまいました。右上のウィンドウでこのブログ記事を書き、右下のウィンドウで ssh ログインして UNIX 版の動作検証、左でツイッターのストリームをダラダラと流し続けている光景です。

ちなみに Windows での terminal は Neovim も実現できていません。

元々、コマンドプロンプトで生活しており、Vim を常駐しない派でしたので今後この端末機能を使うかどうかは正直分かりませんが、何か Vim の新しい時代が来た様な気がしており、久しぶりに書いて良かったなと思えるパッチでした。

まだもう少しバグがあるかもしれませんし、安定しないかもしれませんが、引き続き精力的に開発していく予定です。もちろん「vim-jp が Vim の新しい機能を作っていくんだ」という気持ちに変わりはありません。ぜひ新しく追加された端末機能を使ってみて下さい。

Posted at by